#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

void sig_handler(int, siginfo_t*, void*);

int main(int argc, char** argv)
{
    struct sigaction act;
    sigset_t newmask, oldmask;
    int rc;

    sigemptyset(&newmask); // 清空信号集中的所有信号
    sigaddset(&newmask, SIGINT); // 信号集中添加一个非实时信号 SIGINT
    sigaddset(&newmask, SIGRTMIN); // 信号集中添加一个实时信号 SIGRTMIN
    sigprocmask(SIG_BLOCK, &newmask, &oldmask); // 屏蔽实时信号 SIGRTMIN 和非实时信号 SIGINT，并将之前的信号集保存到 oldmask 中

    act.sa_sigaction = sig_handler;
    act.sa_flags = SA_SIGINFO;

    if (sigaction(SIGINT, &act, NULL) < 0) {
        printf("install SIGINT error\n");
    }

    if (sigaction(SIGRTMIN, &act, NULL) < 0) {
        printf("install SIGRTMIN error\n");
    }

    printf("myprocesspid=%d\n", getpid());

    sleep(60); // 进程睡眠 60 秒，在此时间内，发给该进程的所有实时信号将排队，信号不会丢失

    sigprocmask(SIG_SETMASK, &oldmask, NULL); // 解除 SIGRTMIN 和 SIGINT 信号的屏蔽，此时其信号处理函数被调用
    return 0;
}

void sig_handler(int signum, siginfo_t* info, void* myact) {
    if (signum == SIGINT)
        printf("Got a common signal SIGINT\n");
    else
        printf("Got a real time signal SIGRTMIN\n");
}
